package com.easyprogram.article.service;

import com.easyprogram.article.pojo.Comment;
import com.easyprogram.article.repository.CommentRepository;
import com.easyprogram.util.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Optional;

@Service
public class CommentService {
    @Autowired
    private CommentRepository commentRepository;

    @Autowired
    private IdWorker idWorker;

    @Autowired
    private MongoTemplate mongoTemplate;

    public List<Comment> findAll() {
        List<Comment> list = commentRepository.findAll();

        return list;
    }

    public Comment findById(String commentId) {
        //Comment comment = commentRepository.findById(commentId).get();
        //return comment;

        //推荐下面的写法
        //能够规避
        //NoSuchElementException("No value present") 异常
        Optional<Comment> optional = commentRepository.findById(commentId);
        if(optional.isPresent()){
            return optional.get();
        }else {
            return null;
        }

    }


    public void save(Comment comment) {
        //分布式id生成器生成id
        String id = idWorker.nextId() + "";
        //不建议自己指定MongoDB的_id
        //会降低MongoDB的性能
        //comment.set_id(id);

        //为了避免在分布式系统中出现_id重复的现象
        //可以自己添加一个字段c_id
        //将分布式id生成器生成的id存储到c_id字段中
        //通过c_id来区分
        comment.setC_id(id);

        //初始化点赞数据，发布时间等
        comment.setThumbup(0);
        comment.setPublishdate(new Date());

        //保存数据
        commentRepository.save(comment);
    }


    public void updateById(Comment comment) {
        //使用的是MongoRepository的方法
        //其中save方法，主键如果存在，执行修改，如果不存在执行新增
        commentRepository.save(comment);
    }

    public void deleteById(String commentId) {
        commentRepository.deleteById(commentId);
    }

    public List<Comment> findByArticleId(String articleId) {
        //调用持久层，根据文章id查询
        List<Comment> list = commentRepository.findByArticleid(articleId);
        return list;
    }

    public void thumbUpById(String commentId) {
        //这种方式存在线程安全问题
        //需要查两次库，性能较低
//        Optional<Comment> optional = commentRepository.findById(commentId);
//        if(optional.isPresent()){
//            //根据评论id查询评论数据
//            Comment comment = optional.get();
//            //对评论点赞数据加一
//            comment.setThumbup(comment.getThumbup() + 1);
//            //保存修改数据
//            commentRepository.save(comment);
//        }

        //点赞功能优化
        //封装修改的条件
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(commentId));
        //封装修改的数值
        Update update = new Update();
        //使用inc列值增长
        //使用MongoDB的inc方法不用担心线程安全问题
        //底层已经进行了相应的处理
        //而且只查一次库，性能较高
        update.inc("thumbup", 1);
        //直接修改数据
        //第一个参数是修改的条件
        //第二个参数是修改的数值
        //第三个参数是MongoDB的集合名称
        mongoTemplate.updateFirst(query, update, "comment");
    }

    public void thumbUpDelById(String commentId) {

        //封装修改的条件
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(commentId));
        //封装修改的数值
        Update update = new Update();
        //使用inc列值增长
        update.inc("thumbup", -1);
        //直接修改数据
        //第一个参数是修改的条件
        //第二个参数是修改的数值
        //第三个参数是MongoDB的集合名称
        mongoTemplate.updateFirst(query, update, "comment");
    }

}
